<?php
/**
 * Класс обеспечивает формирование и хранение списка ошибок
 * 
 * @author Дмитрий Кузьма <kouzma.d@gmail.com>
 * @version 1.0
 */
class Exception_Multiline extends Exception implements ArrayAccess, Iterator {
  /**
   * Список ошибок.
   *
   * @var array
   */
  protected $_list = array();
   
  public function __construct() {
  }
   
  /**
   * Проверяет, существует ли соответствующий индекс в массиве
   *
   * @param integer $index - проверяемый индекс
   * @return bool
   */
  public function offsetExists($index) {
    return isset($this->_list[$index]);
  }
  
  /**
   * Возвращает значение массива по индексу
   *
   * @param integer $index - индекс массива
   * @return mixed
   */
  public function offsetGet($index) {
    return $this->_list[$index];
  }
  
  /**
   * Вставляет значение в массив. По заданному индексу, если он уже существует или в конец массива
   *
   * @param integer $index
   * @param mixed $value
   */
  public function offsetSet($index, $value) {
    if (isset($index)) {
      $this->_list[$index] = $value;
    }
    else {
      $this->_list[] = $value;
    }
  }
  
  /**
   * Удаляет элемент из массива по индексу
   *
   * @param integer $index - индекс массива
   */
  public function offsetUnset($index) {
    unset($this->_list[$index]);
  }
      
  /**
   * Возвращает текущий элемент массива
   *
   * @return mixed - текущий элемент массива
   */
  public function current() {
    return current($this->_list);
  }
  
  /**
   * Возвращает ключ текущего элемента
   *
   * @return mixed - ключ текущего элемента
   */
  public function key() {
    return key($this->_list);
  }
  
  /**
   * Переход к следующему элементу массива и возвращает его значение
   *
   * @return mixed - значение следующего элемента массива
   */
  public function next() {
    return next($this->_list);
  }
  
  /**
   * Переходит в начало массива и возвращает значение первого (нулевого) элемента
   *
   * @return mixed - значение первого (нулевого) элемента
   */
  public function rewind() {
    return reset($this->_list);
  }
  public function valid() {
    return (bool) $this->current();
  }  
  /**
   * Проверяет, были ли ошибки
   *
   * @return bool - есть ли ошибки
   */
  public function isErrorExists() {
    return (bool) sizeof($this->_list);
  }
}
?>